package data;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Observable;
import java.util.Observer;

import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.border.EmptyBorder;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;

import database.ConnexionDB;

public class ModeleDynamiqueObjet extends AbstractTableModel implements Observer, TableModelListener {
	private Object[][] donnees;
	private final String[] entetes = {"Id","Login", "Password", "Admin", "Chrono"};
	private ArrayList<Utilisateur> listUtilisateur = new ArrayList<Utilisateur>();
	private static ConnexionDB DB;
	
	public ModeleDynamiqueObjet(ConnexionDB BD)
	{
		super();
		DB = BD;
		this.addTableModelListener(this);
	}
	public ConnexionDB getDB() {
		return DB;
	}
	public void setDB(ConnexionDB dB) {
		DB = dB;
	}
	public int getRowCount() {
        return listUtilisateur.size();
    }

    public int getColumnCount() {
        return entetes.length;
    }

    public String getColumnName(int columnIndex) {
        return entetes[columnIndex];
    }

    public Object getValueAt(int rowIndex, int columnIndex) {
        switch(columnIndex){
            case 0:
                return listUtilisateur.get(rowIndex).getIdUtilisateur();
            case 1:
                return listUtilisateur.get(rowIndex).getPseudoUtilisateur();
            case 2:
                return listUtilisateur.get(rowIndex).getPasswordUtilisateur();
            case 3:
                return listUtilisateur.get(rowIndex).isAdmin();
            case 4:
            	Temps t = new Temps(listUtilisateur.get(rowIndex).getChronoUtilisateur());
            	String chrono = t.getHeures() + ":" + t.getMinutes() + ":" + t.getSecondes();
                return chrono;
            default:
                return null; 
        }
    }
    
    /*public boolean isCellEditable(int row, int column) {
        return true;
      }*/
    
    public void removeRow(int row) {
		listUtilisateur.remove(row);
		fireTableStructureChanged();
	}
    
    public void insertRow(int row, Utilisateur u) {
    	listUtilisateur.add(row, u);
		fireTableStructureChanged();
	}
    
    public void addRow(Utilisateur u1) {
		addRow(u1);
		fireTableStructureChanged();
	}

	public void addUtilisateur(Utilisateur utilisateur) {
		//System.out.println(utilisateur.toString());
		listUtilisateur.add(utilisateur);
        fireTableRowsInserted(listUtilisateur.size() -1, listUtilisateur.size() -1);
    }
	
	public void clear(){
		listUtilisateur.clear();
		fireTableStructureChanged();
	}
	@Override
	public void update(Observable arg0, Object arg1){
		// DataBase changed
		ConnexionDB DB = (ConnexionDB) arg0;
		
		String requeteSelectUsers = "SELECT * FROM utilisateurs";
      	 
        ResultSet resultat; 
        clear();
			
        try {
			resultat = DB.executerRequete(requeteSelectUsers);
			while(resultat.next()){
	   			   Utilisateur u = new Utilisateur();
	               //System.out.println(resultat.getString("id_utilisateur") + "\t\t" + resultat.getString("pseudo") + "\t\t" + resultat.getString("password")+ "\t\t" + resultat.getString("admin")+ "\t\t" + resultat.getString("chrono"));
	               u.setIdUtilisateur(resultat.getInt("id_utilisateur"));
	               u.setPseudoUtilisateur(resultat.getString("pseudo"));
	               u.setPasswordUtilisateur(resultat.getString("password"));
	               u.setAdmin(resultat.getBoolean("admin"));
	               u.setChronoUtilisateur(resultat.getLong("chrono"));
	               addUtilisateur(u);
	           }
		} catch (SQLException e) {
			// uto-generated catch block
			e.printStackTrace();
		}
	}
	
	public ArrayList<Utilisateur> getListUtilisateur() {
		return listUtilisateur;
	}
	public void setListUtilisateur(ArrayList<Utilisateur> listUtilisateur) {
		this.listUtilisateur = listUtilisateur;
	}
	
	/*public void setValueAt(Object value, int row, int col) 
	{	
		try {
			updateUtilisateur(value,row,col);
		} catch (SQLException e) {
			//  Auto-generated catch block
			e.printStackTrace();
		}
    }*/
	
	public void insererUtilisateur(final Utilisateur u1) throws SQLException
	{
		final Utilisateur u = u1;
		new Thread(new Runnable() {
			@Override
			public void run() {
				//  Auto-generated method stub
				try {
					getDB().insertLigneUtilisateurs(u.getPseudoUtilisateur(), u.getPasswordUtilisateur(), u.isAdmin(), u.getChronoUtilisateur());
				} catch (SQLException e) {
					//Auto-generated catch block
					e.printStackTrace();
				}
			}
		}).start();
	}
	
	public Thread updateUtilisateur(final Utilisateur u1) throws SQLException
	{
		Thread t=new Thread(new Runnable() {
			@Override
			public void run() {
				// Auto-generated method stub
				try {
					DB.updateLigneUtilisateursAdmin(u1.getIdUtilisateur(),u1.isAdmin());
					DB.updateLigneUtilisateursChrono(u1.getIdUtilisateur(),u1.getChronoUtilisateur());
					DB.updateLigneUtilisateursPassword(u1.getIdUtilisateur(),u1.getPasswordUtilisateur());
					DB.updateLigneUtilisateursPseudo(u1.getIdUtilisateur(),u1.getPseudoUtilisateur());
				} catch (SQLException e) {
					//  Auto-generated catch block
					e.printStackTrace();
				}
			}
		});
		t.start();
		return t;
	}
	
	public Thread deleteUtilisateur(final int id) throws SQLException
	{	
		Thread t = new Thread(new Runnable() {
			@Override
			public void run() {
				// Auto-generated method stub
				try {
						getDB().deleteLigneUtilisateurs(id);
				} catch (SQLException e) {
					//  Auto-generated catch block
					e.printStackTrace();
				}
			}
		});
		t.start();
		return t;
	}
	
	/*public void updateUtilisateur(final Object value,final int row,final int col) throws SQLException
	{
		new Thread(new Runnable() {
			@Override
			public void run() {
				//  Auto-generated method stub
				try {
					int id = getListUtilisateur().get(row).getIdUtilisateur();
					Utilisateur u = DB.selectUtilisateurId(id);
					System.out.println("Nom colonne " + getColumnName(col));
					if(getColumnName(col).equals("Login")) 
						DB.updateLigneUtilisateursPseudo(id,value.toString());
					else if(getColumnName(col).equals("Password"))
						DB.updateLigneUtilisateursPassword(id,value.toString());
					else if(getColumnName(col).equals("Admin"))
					{
						if(value.toString().equals("true"))
							DB.updateLigneUtilisateursAdmin(id,true);
						else if(value.toString().equals("false"))
							DB.updateLigneUtilisateursAdmin(id,false);
						else
							JOptionPane.showMessageDialog(null, "La valeur doit �tre 'false' ou 'true'");
					}
					else if(getColumnName(col).equals("Chrono"))
						DB.updateLigneUtilisateursChrono(id,Long.parseLong(value.toString()));
				} catch (SQLException e) {
					//  Auto-generated catch block
					e.printStackTrace();
				}
			}

		}).start();
		
	}*/
	@Override
	public void tableChanged(TableModelEvent arg0) {
		// Auto-generated method stub
		
	}
	public static void enleverTemps(int idUtilisateur, int coutIndice) {
		
		DB.enleverTemp(idUtilisateur,coutIndice);
		
	}
}
